'''

    1. 闭包： 本质是一个函数， 如果一个内部函数引用了外部作用域中的变量， 那么这个函数就被认为是闭包
    即使删除外部函数， 内部函数对外部作用域的变量引用仍然存在
    2. global： 在局部引用全局变量可以直接引用， 但如果要修改，就要用global
    3. nolocal： 引用外部作用域的局部变量，要用nolocal关键字
'''


def f():
    m = 1

    def g():
        nonlocal m # 不用nonlocal 就有歧义， 因为程序不知道你是新定义的m，还是上一个作用域的m
        m += 10
        # m = 10
        return m*10
    return g

a = f()
print(f()())
print(a.__closure__)
print(a.__closure__[0].cell_contents)  # 内部方法引用的闭包变量

#
# first = []
#
# # 输出：4,4,4
# # 原因：循环执行完后，i变成2后才赋值给函数
# for i in range(3):
#     def loop():
#         return i * 2
#
#
#     first.append(loop)
#
# for f in first:
#     print(f())


x = 100

def a():
    x = 101
    def b():
        nonlocal x
        x = 10
        print(x)
    print(x)
    b()
    print(x)
if __name__ == '__main__':
    x +=100
    print(x)
    a()
    print(x)
    